<?php

/**
 * Classe que carrega as mensagens que serão exibidas nas views.
 * @author CPD Desenvolvimento UEPB
 */
class Mensagem {
    // Constantes para representar os tipos de erros

    const SUCESSO = "sucesso";
    const ERRO = "erro";
    const AVISO = "aviso";
    const TITULO_AVISO = "Atenção!";

    // Variáveis que carregam as mensagens
    private static $texto = NULL;
    private static $tipo = NULL;

    /**
     * Configura uma mensagem de um certo tipo.
     *
     * @param $texto O texto da mensagem.
     * @param $tipo O tipo da mensagem, que pode ser uma das constantes definidas no topo dessa classe.
     * @param $separador Elemento HTML para separa as mensagens, em caso de envio de vários textos.
     */
    public static function setMensagem($textos, $tipo, $separador = "p") {
        if (is_array($textos)) {
            $mensagem = "";
            foreach ($textos as $texto) {
                $mensagem .= "<{$separador}>";
                $mensagem .= $texto;
                $mensagem .= "</{$separador}>";
            }
        } else {
            $mensagem = $textos;
        }
        self::$texto = $mensagem;
        self::$tipo = $tipo;
    }

    /**
     * Atalho para a configuração de mensagens de sucesso.
     *
     * @param $texto O texto da mensagem.
     */
    public static function setMensagemSucesso($texto) {
        self::setMensagem($texto, self::SUCESSO);
    }

    /**
     * Atalho para a configuração de mensagens de aviso.
     *
     * @param $texto O texto da mensagem.
     */
    public static function setMensagemAviso($texto) {
        self::setMensagem($texto, self::AVISO);
    }

    /**
     * Atalho para a configuração de mensagens de erro.
     *
     * @param $texto O texto da mensagem.
     */
    public static function setMensagemErro($texto) {
        self::setMensagem($texto, self::ERRO);
    }

    /**
     * Atalho para a configuração de mensagens de erro
     * a partir de uma exceção.
     *
     * @param $e A exceção da qual a mensagem de erro será retirada.
     */
    public static function setExcecao(Exception $e) {
        if ($e != NULL) {
            self::setMensagem($e->getMessage(), self::ERRO);
        }
    }

    /**
     * Atalho para a configuração de mensagens de aviso
     * a partir de uma exceção elemento nao encontrado.
     *
     * @param $e A exceção da qual a mensagem de erro será retirada.
     */
    public static function setExcecaoAviso(ExceptionElementoNaoEncontrado $en) {
        if ($en != NULL) {
            self::setMensagem($en->getMessage(), self::AVISO);
        }
    }

    /**
     * Elimina (limpa) a mensagem configurada atualmente.
     */
    public static function reset() {
        self::setMensagem(NULL, NULL);
    }

    /**
     * Verifica se existe uma mensagem de erro configurada.
     *
     * @return unknown_type
     */
    public static function existe() {
        return self::getTexto() != NULL && self::getTipo() != NULL;
    }

    /**
     * Obtém o texto da mensagem.
     *
     * @return O texto da mensagem.
     */
    public static function getTexto() {
        return self::$texto;
    }

    /**
     * Obtém o tipo da mensagem.
     *
     * @return O tipo da mensagem.
     */
    private static function getTipo() {
        return self::$tipo;
    }

    /**
     * Obtém a classe CSS do tipo dessa mensagem.
     *
     * @return O texto com o nome da classe CSS para essa mensagem.
     */
    public static function getClasseTipo() {
        // atualmente, a classe é o texto da constante
        return self::$tipo;
    }

    /**
     * Obtém o título apropriado para a mensagem.
     *
     * @return O título para a mensagem.
     */
    public static function getTituloTipo() {
        // atualmente, o título é o texto da constante
        // com a primeira letra em upper
        return ucfirst(self::$tipo);
    }

}